package plug.PenduPlugin;

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Date;

import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;

import Controller.EtudiantController;
import Controller.MainController;
import Model.Enonce;
import Model.Exercice;
import Model.Resultat;

import view.Fenetre;
import view.Param;

@SuppressWarnings("serial")
public class PenduPanelEtud extends JPanel implements ActionListener {

	private MainController control;
	private Exercice exo;
	private JPanel pUp, pCenter, pDown;
	private JLabel lImg;
	private JTextArea tMot;
	private JButton[] alphabet;
	private String answer, hiddenWord;
	private int nbErreurs;
	private boolean boucle;

	public PenduPanelEtud(MainController control, Exercice exo) {

		// Initialisation des variables
		this.control = control;
		this.exo = exo;
		Enonce enonce = exo.getEnonce();
		this.answer = exo.getCorrection().getContenu();
		hiddenWord = "";
		nbErreurs = 0;

		// Alignement vertical des conteneurs
		this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

		// Creation des conteneurs
		pUp = new JPanel();										// Panneau image
		pCenter = new JPanel();									// Panneau texte
		pDown = new JPanel();									// Panneau clavier

		// Ajout de la transparence
		this.setOpaque(false);
		pUp.setOpaque(false);
		pCenter.setOpaque(false);
		pDown.setOpaque(false);

		lImg = new JLabel(new ImageIcon(getClass().getResource("img/pendu_0.gif")));
		pUp.add(lImg);

		// Initialisation de la zone de texte qui contient le mot a trouver
		for (int i=0; i<answer.length(); i++){
			hiddenWord += "-";
		}

		tMot = new JTextArea(hiddenWord);
		tMot.setEditable(false);
		pCenter.add(tMot);

		// Creation d'un tableau de boutons pour les lettres
		alphabet = new JButton[26];

		// Agencement des conteneurs du panneau de boutons
		GridBagConstraints constraint = new GridBagConstraints();
		pDown.setLayout(new GridBagLayout());


		// CONTRAINTE DU PANNEAU DE BOUTONS

		constraint.weighty = 0.3;

		for (int i=0; i<alphabet.length; i++) {

			char ascii = (char)('A'+i);
			String c = Character.toString(ascii);
			alphabet[i] = new JButton(c);
			alphabet[i].setName(c);
			alphabet[i].addActionListener(this);

			constraint.gridx = i%9;
			constraint.gridy = i/9;

			pDown.add(alphabet[i], constraint);

		}

		// Ajout des conteneurs au panel
		this.add(new JLabel(enonce.getContenu()));
		this.add(pUp);
		this.add(pCenter);
		this.add(pDown);
		
		// Ajout des marges
		pUp.setBorder(Param.wideMargin);
		pCenter.setBorder(Param.shortMargin);

	}

	public void actionPerformed(ActionEvent event) {

		JButton button = (JButton) event.getSource();
		boucle = false;

		for (int i=0; i<answer.length(); i++) {

			String alpha = Character.toString(answer.charAt(i));

			if (button.getName().equals(alpha)) {

				String motcache2 = "";

				for (int j=0; j<answer.length(); j++) {

					if (j != i) {
						motcache2 += hiddenWord.charAt(j);
					}
					else {
						motcache2 += answer.charAt(j);
						boucle = true;
					}
				}
				hiddenWord = motcache2;
				tMot.setText(hiddenWord);
			}

		}

		// Desactivation de la lettre cliquee
		button.setEnabled(false);

		boolean end = false;

		if (!boucle) { // Si on s'est trompe de lettre

			nbErreurs++;

			if (nbErreurs <= 7) {

				lImg.setIcon(new ImageIcon(getClass().getResource("img/pendu_" + nbErreurs + ".gif")));

			}

			if (nbErreurs >= 7) {

				for (int i=0; i<alphabet.length; i++) {

					if (alphabet[i].isEnabled()) {
						alphabet[i].setEnabled(false);
					}

				}

				tMot.setText(answer);
				tMot.setForeground(Color.red);

				JLabel fin = new JLabel("Vous avez perdu !");
				pUp.add(fin);
				end = true;
				Fenetre.fen.validate();
			}
		}
		else if (hiddenWord.equals(answer)) { // Si on a trouve le mot cache

			for (int i=0; i<alphabet.length; i++) {

				if (alphabet[i].isEnabled()) {
					alphabet[i].setEnabled(false);
				}

			}

			tMot.setForeground(Param.darkGreenColor);

			JLabel fin = new JLabel("Vous avez gagn\u00E9 !");
			pUp.add(fin);
			end = true;
			Fenetre.fen.validate();

		}

		if (end) {

			Pendu pendu = (Pendu) exo;
			EtudiantController e = control.getEtudiantController();
			Resultat r = new Resultat(pendu, e.getEtudiant());

			r.setDate(new Date(System.currentTimeMillis()));

		}

	}

}
